import numpy as np

def rollout(env, policy, max_path_length=np.inf,
            animated=False, ignore_done=False,
            num_rollouts=1, adapt_batch_size=None):
    ''' get wrapped env '''
    # 获取被包装的环境
    wrapped_env = env
    while hasattr(wrapped_env, '_wrapped_env'):
        wrapped_env = wrapped_env._wrapped_env

    paths = []  # 用于存储路径信息的列表
    a_bs = adapt_batch_size  # 自适应批处理大小

    for i in range(num_rollouts):
        observations = []  # 观测值列表
        actions = []  # 动作列表
        rewards = []  # 奖励列表
        agent_infos = []  # 代理信息列表
        env_infos = []  # 环境信息列表

        o = env.reset()  # 重置环境并获取初始观测值
        policy.reset()  # 重置策略
        path_length = 0  # 路径长度计数器

        while path_length < max_path_length:
            # 如果超过自适应批处理大小，并且已经收集了足够的样本，进行模型适应
            if a_bs is not None and len(observations) > a_bs + 1:
                adapt_obs = observations[-a_bs - 1:-1]  # 自适应观测值
                adapt_act = actions[-a_bs - 1:-1]  # 自适应动作
                adapt_next_obs = observations[-a_bs:]  # 自适应下一个观测值
                policy.dynamics_model.switch_to_pre_adapt()  # 切换到预适应状态
                policy.dynamics_model.adapt([np.array(adapt_obs)], [np.array(adapt_act)],
                                            [np.array(adapt_next_obs)])  # 模型适应

            a, agent_info = policy.get_action(o)  # 根据当前观测值获取动作和代理信息
            next_o, r, d, env_info = env.step(a)  # 执行动作并获取下一个观测值、奖励和环境信息

            observations.append(o)  # 存储当前观测值
            rewards.append(r)  # 存储获得的奖励
            actions.append(a[0])  # 存储执行的动作
            agent_infos.append(agent_info)  # 存储代理信息
            env_infos.append(env_info)  # 存储环境信息

            path_length += 1  # 增加路径长度计数器
            if d and not ignore_done:  # 如果达到终止状态且不忽略终止状态
                break
            o = next_o  # 更新当前观测值为下一个观测值

            if animated:
                env.render()  # 渲染环境并显示动画（如果需要）

        paths.append(dict(
            observations=observations,
            actions=actions,
            rewards=rewards,
            agent_infos=agent_infos,
            env_infos=env_infos
        ))  # 将生成的路径信息存储到列表中

    return paths  # 返回所有路径信息的列表
